// package com.eerl.pdev.werl.impl;
//
// import com.eerl.pdev.util.EToolPluginConsoleToolWindowFactory;
// import com.eerl.pdev.werl.ERpc;
// import com.eerl.pdev.werl.ERpcReturn;
// import com.intellij.openapi.project.Project;
// import lombok.Getter;
// import lombok.ToString;
//
// import java.io.BufferedReader;
// import java.io.IOException;
// import java.io.InputStreamReader;
// import java.net.ServerSocket;
// import java.net.Socket;
// import java.nio.charset.StandardCharsets;
// import java.util.regex.Matcher;
// import java.util.regex.Pattern;
//
// // erl -noshell -name win_exec@127.0.0.1 -setcookie s98zksns891jsj -eval "R='cahx_xlllocal_1@127.0.0.1', Re=rpc:call(R,lib_time,unixtime,[]),io:format(\"~w~n\",[Re])" -s c q
// @ToString
// public class WErlERpcImpl implements ERpc<String> {
//
//     private final String remoteNodeName;
//     private final String cookie;
//     private final Project project;
//     @Getter
//     private final static String ERL_RPC_RET_FLAG = "xlllgogogo1729516211000xlllgogogo";
//     private final Pattern pattern = Pattern.compile(ERL_RPC_RET_FLAG + "\\|(.*)");
//
//     private final String cmdSlots =  "erl -noshell -name win_exec@127.0.0.1 -setcookie %s -eval \"io:setopts([{encoding,unicode}]), R='%s', Re=rpc:call(R,%s,%s,%s),io:format(\\\" " + ERL_RPC_RET_FLAG + "|~w~n\\\",[Re])\" -s c q";
//
//     public WErlERpcImpl(Project project, String remoteNodeName, String cookie) {
//         this.project = project;
//         this.remoteNodeName = remoteNodeName;
//         this.cookie = cookie;
//     }
//
//     @Override
//     public void initRemoteNodeConfiguration() {
//
//     }
//
//     @Override
//     public ERpcReturn<String> cast(String mod, String fun, String args) {
//         return null;
//     }
//
//     @Override
//     public ERpcReturn<String> call(String mod, String fun, String args) {
//         EToolPluginConsoleToolWindowFactory.printToConsole(project, "args => " + args);
//         return execMFA(mod, fun, args);
//     }
//
//     private ERpcReturn<String> execMFA(String mod, String fun, String args) {
//         try {
//             String command = String.format(cmdSlots, cookie, remoteNodeName, mod, fun, args);
//             EToolPluginConsoleToolWindowFactory.printToConsole(project, command);
//             Process exec = Runtime.getRuntime().exec(command);
//             StringBuilder builder = new StringBuilder();
//             exec.onExit().join();
//             if (exec.exitValue() == 0) {
//                 exec.inputReader(StandardCharsets.UTF_8).lines().forEach(builder::append);
//             } else {
//                 exec.inputReader(StandardCharsets.UTF_8).lines().forEach(builder::append);
//                 exec.errorReader(StandardCharsets.UTF_8).lines().forEach(builder::append);
//             }
//             String string = builder.toString();
//             EToolPluginConsoleToolWindowFactory.debugPrint(project, string);
//             return new StringERpcReturn(true, parseReturn(string));
//         } catch (Exception e) {
//             EToolPluginConsoleToolWindowFactory.errToConsole(project, e.getMessage());
//             return new StringERpcReturn(false, e.getMessage(), "");
//         }
//     }
//
//     // extract process return string
//     private String parseReturn(String retString) {
//         Matcher matcher = pattern.matcher(retString);
//         if (matcher.find()) {
//             return matcher.group(1);
//         }
//         throw new RuntimeException("cannot parse process string: " + retString);
//     }
//
//     private static class Connector extends Thread {
//         private static final int SERVER_SOCKET_PORT = 23654;
//         Project project;
//         Connector(Project project) {
//             this.project = project;
//         }
//
//         @Override
//         public void run() {
//             try {
//                 Pattern pattern = Pattern.compile(ERL_RPC_RET_FLAG + "\\|" + "([_a-zA-Z0-9']+)=([^|]+)" + "\\|" + ERL_RPC_RET_FLAG);
//                 ServerSocket serverSocket = new ServerSocket(SERVER_SOCKET_PORT);
//                 Socket accept = serverSocket.accept();
//                 BufferedReader in = new BufferedReader(new InputStreamReader(accept.getInputStream()));
//                 String line;
//                 while ((line = in.readLine()) != null) {
//                     Matcher matcher = pattern.matcher(line);
//                     if (matcher.find()) {
//                         String varName = matcher.group(1);
//                         String varValue = matcher.group(2);
//                         EToolPluginConsoleToolWindowFactory.printToConsole(project, "match => " + varName  +  "=" + varValue);
//                     } else {
//                         System.out.println("==> " + line);
//                     }
//                 }
//                 System.out.println("========== end ===============" + accept.isClosed() + serverSocket.isClosed());
//             } catch (IOException e) {
//                 throw new RuntimeException(e);
//             }
//
//         }
//     }
// }
